

// always requires an idle view 
#include "kb.h"
#include "touch_algorithm.h"
#include "gui.h"

#include "views.h"

#include "xapp_clock.h"
#include "xapp_pedometer.h"
#include "xapp_profile.h"
#include "xapp_localize.h"

#include "log.h"
#define LOG     LOG_INFO0

static void initialize(gui_menu_t * menu, void* pvParameter); 
static void display_callback_func(gui_menu_t * menu);
static int display_refresh_func(gui_menu_t * menu);
static bool on_destroy_func(gui_menu_t * menu);

static void on_button(void* pvParameters, gui_menu_t * menu);  
static void on_touch(void* pvParameters, gui_menu_t * menu);
static void on_event_update(void * pvParameters, gui_menu_t * menu); 

const static ui_widgets_type_t wglChartCurveDemo[] = 
{
    // background 
    [0] = uiCanvas( 0, 0, 240, 240, COLOR_BLACK ),
    // hour shi
    [1] = uiChartCurve( 20, 100, 200, 80 ),
    
    [2] = uiChartCurveItem( 20, 140, 200, 40), 

};

static const gui_func_t basefunc = 
{
    .init = initialize,
    .on_touch = on_touch,
    .on_button = on_button,
    .on_event_update = on_event_update,     
    
    .display_func = display_callback_func,
    .refresh_func_check = display_refresh_func,
    .destroy_func = on_destroy_func
};

gui_view_t viewChartCurveDemo = 
{
    .func = &basefunc,
    
    .parent = NULL,
    .pWidgetlist =  (ui_widgets_type_t*)wglChartCurveDemo ,
    .widget_cnt = WIDGET_COUNT( wglChartCurveDemo ),

    .flag = GUI_VIEW_FLAG_FUNC
};

static uint8_t ratio = 0;
static uint8_t last_min = 0;
static ui_refresh_part_t curve_refresh_part; 
static int16_t idx_of_curve_item = 0;

static bool get_curve_pts(int index, uint16_t height, ui_chart_pts_t* pts)
{
    pts->color = COLOR_RED;    
    
    pts->curve.maximum = ratio + 2 * index + 1; 
    if( pts->curve.maximum > height )
    {
        pts->curve.maximum = pts->curve.maximum % height; 
    }

    pts->curve.minimum = 0;//last_min; 使用曲线，则将上一个点的最大值赋于当前最小值；如果使用填充，则直接赋0 
    last_min = pts->curve.maximum ;
    
    return true;
}

static bool get_curve_item_pts(int index, uint16_t height, ui_chart_pts_t* pts)
{
    pts->color = COLOR_GREEN;
    
    
    pts->curve.maximum = 2 * idx_of_curve_item + 1; 
    if( pts->curve.maximum > height )
    {
        pts->curve.maximum = pts->curve.maximum % height; 
    }

    pts->curve.minimum = 0;//last_min; 
    last_min = pts->curve.maximum ;

    return true; 
}

/* 当前view初始化
// 需要指定前使用的控件组
// 自动更新间隔，不使用自动更新间隔则interval = 0

*/
static void initialize(gui_menu_t * menu, void* pvParameter)
{
    menu->interval = 0;
    menu->lifetime = 0; 

    // 记录创建idle view的时间戳，用于按键输入时，检测上一次需要显示的界面
//    m_idle_timestamp = hub_clock_get_ticks();
}

/* 销毁函数
// 在销毁前处理当前信息，比如不允许销毁时，将当前界面状态保存为background。
// true:  允许销毁
// false: 不允许自动销毁，则GUI只关闭当前显示，输入事件仍由当前view进行处理。
          那么view判断当前状态为background时，作出对应background下的按键、触摸等事件反馈
*/
static bool on_destroy_func(gui_menu_t * menu)
{
    /*
        set_fsm( fsmIdleBackground ); 
        return false; 
    */
    
    return true; 
}

/* 显示回调
   重新指定参数, 用来获取当前界面的控件组
   ** 当前界面有多个控件组时，应该有条件确定使用哪一组控件组 ** 
*/
static void display_callback_func(gui_menu_t * menu)
{
    ui_property_t prop;
    ui_widgets_type_t * widgets = menu->widgets;

    // 部分更新，只更新chartcurveitem
    if( menu->source == GUI_VIEW_REQ_SRC_CREATE )
    {
//        prop.chartcurve.getpts = get_curve_pts;
        prop.chartcurve.cnt = 200;
        gui_widget_update_prop( &widgets[1], &prop ); 
        
        prop.chartcurveitem.cnt = 1;
//        prop.chartcurveitem.getpts = get_curve_item_pts; 
        gui_widget_update_prop( &widgets[2], &prop ); 
        widgets[2].uiChartCurveItem.getpts = get_curve_item_pts; // 回调函数提供更新数据
        
        ratio = 0; 

        gui_part_t part = GUI_PART_CONFIG_ALL( curve_refresh_part, 1, 50 );
        gui_part_create( &part );
    }
    
    if( menu->source == GUI_VIEW_REQ_SRC_UPDATE_PART )
    {
        widgets[1].visible = 0; 
        widgets[2].visible = 1; // 开启动态曲线块刷新

        // 更新下一个点的开始位置      
        if( idx_of_curve_item >= widgets[2].w )
        {
            idx_of_curve_item = 0; 
        }
        prop.chartcurveitem.nx = idx_of_curve_item;
        prop.chartcurveitem.cnt = 2;
        prop.chartcurveitem.getpts = NULL;
        gui_widget_update_prop( &widgets[2], &prop ); 
        
        // 更新刷新位置
        curve_refresh_part.enabled = true;
        curve_refresh_part.x = widgets[2].x + idx_of_curve_item;
        curve_refresh_part.y = widgets[2].y;
        curve_refresh_part.w = 5;
        curve_refresh_part.h = widgets[2].h;

        idx_of_curve_item += 2; // 下一个点
    }
    
    
    // 显示刷新后，启动定时区域刷新
}

/* 刷新显示回调
   根据当前状态，重新绘制指定的控件组 
*/
static int display_refresh_func(gui_menu_t * menu)
{
    return 1;
}

static void on_touch(void* pvParameters, gui_menu_t * menu)
{
    tp_algo_evt_t* touch = (tp_algo_evt_t*)pvParameters;

    switch( touch->type )
    {
        case TP_ALGO_EVT_TYPE_CLICK:
        
        break;
        
        case TP_ALGO_EVT_TYPE_SLIDE_D:
        break;
        
        case TP_ALGO_EVT_TYPE_SLIDE_U:
        break;
        
        case TP_ALGO_EVT_TYPE_SLIDE_L:
        gui_core_view_create_navigate( &viewWatchface2, &viewTextScrollDemo, 0, 0, GUI_LCD_RES_H, 0 );    
        break;
        
        case TP_ALGO_EVT_TYPE_SLIDE_R:
        break;
        
        default:
        break;
    }
}
/* 界面的按键处理

*/
static void on_button(void* pvParameters, gui_menu_t * menu)
{
    kb_evt_t * kb = (kb_evt_t*)pvParameters;
    
    switch( kb->type ) 
    {
        case KB_EVT_CLICK:
        LOG("[VIEW]: button click");
        gui_core_view_create_navigate( &viewWatchface2, &viewTextScrollDemo, 0, 0, GUI_LCD_RES_H, 0 );
        break; 
           
        case KB_EVT_SHORT_HOLD_READY:

        break;

        default:
            break;
    }
 
}

static void on_event_update(void * pvParameters, gui_menu_t * menu)
{
    
}

